Skip to main content

스트레티지 패턴

스트레티지 패턴의 정의​

스트레티지 패턴이란 실행 중에 알고리즘을 선택할 수 있는 디자인 패턴이다. 스트레티지 패턴은 특정 계열들의 알고리즘들을 정의하고, 이 유사한 알고리즘들을 캡슐화한 후 알고리즘 변경이 필요할 때, 알고리즘을 직접 수정하는 게 아닌 교체하여 유연하게 확장하는 방법이다. 스트레티지 패턴은 전략 패턴이라고도 불린다.

스트레티지 패턴 예시 (java)​

간단하게 덧셈, 뺄셈, 곱셈 연산을 스트레티지 패턴을 활용한 과정은 다음과 같다.

  1. Strategy 인터페이스를 생성한다.
public interface Strategy {
public int doOperation(int num1, int num2);
}
  1. Strategy 인터페이스에 세부적인 클래스들(덧셈, 뺄셈, 곱셈)을 생성한다.
/* 덧셈 */
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
/* 뺄셈 */
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
/* 곱셈 */
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
  1. Context 클래스를 생성한다.
public class Context {
private Strategy strategy;

public Context(Strategy strategy){
this.strategy = strategy;
}

public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
  1. Context를 사용하여, Strategy를 변경하면 변화가 생기는지 확인한다.
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); // 10 + 5 = 15

context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); // 10 - 5 = 5

context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); // 10 * 5 = 50
}
}

스트레티지 패턴의 장단점​

  • 장점
    • 요구사항이 변경되었을 때 기존의 코드를 변경하지 않고, 새로운 전략을 추가하는 방식으로 진행하면 되기때문에 SOLID 원칙 중 OCP (개방폐쇄의 원칙)을 준수할 수 있다.
  • 단점
    • 세부적인 전략들은 모두 Strategy 인터페이스를 공유하기 때문에 Strategy 인터페이스를 통해 들어온 인자들을 다 사용하지 않아도 되나 전달받는 상황이 발생할 수 있다. 다시 말해, Strategy와 Context 간 의사소통 오버헤드가 있다.

나올 수 있는 면접 질문​

  • 스트레티지 패턴이란?
  • 스트레티지 패턴의 장단점?
  • 스트레티지 패턴이 적용되면 좋을 상황은?
    • 하나의 클래스가 많은 행동들을 정의하고, 많은 조건문의 모습을 가질 때 Strategy 패턴을 적용하면 유용하다.

참고​

기여자​


Junho Moon

📦